package site.sorghum.ddl.entity;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import site.sorghum.ddl.defaults.JdbcTypeToDbSizeDigitConverter;
import site.sorghum.ddl.extra.ColumnNameUtil;
import site.sorghum.ddl.field.TypeConverter;

import java.sql.JDBCType;

@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
public class DdlColumnWrap {
    private String table;             // 表名
    private String name;              // 列名
    private JDBCType ddlType;           // 列类型
    private String dbType;             // 数据库类型
    private Integer size;             // 列大小
    private Integer digit;            // 列精度
    private Boolean isNullable;        // 是否可为空
    private String defaultValue;      // 默认值
    private String remarks;           // 备注
    private Integer indexGroup;            // 索引组
    private boolean unique;             // 是否唯一
    private int weight;           // 权重值

    public String getName() {
        return ColumnNameUtil.removePrefixSuffixChar(name);
    }

    /**
     * 获取列类型
     *
     * @param typeConverter 类型转换器
     * @return 列类型
     */
    public String getSqlType(TypeConverter typeConverter) {
        if (dbType != null && !dbType.isEmpty()) {
            return dbType;
        }
        return typeConverter.convertToDatabaseType(ddlType);
    }

    /**
     * 获取当前对象的大小
     *
     * @return 如果 size 为 null，则调用 JdbcTypeToDbSizeDigitConverter.getSize(ddlType) 获取大小；否则返回 size
     */
    public Integer getSize() {
        // 检查 size 是否为 null
        if (size == null) {
            // 如果是，则通过 JdbcTypeToDbSizeDigitConverter 获取 ddlType 对应的大小
            return JdbcTypeToDbSizeDigitConverter.getSize(ddlType);
        }
        if (size == 0) {
            return null;
        }
        // 返回已存在的 size 值
        return size;
    }

    /**
     * 获取当前对象的数字
     *
     * @return 如果 digit 为 null，则调用 JdbcTypeToDbSizeDigitConverter.getDigit(ddlType) 获取数字；否则返回 digit
     */
    public Integer getDigit() {
        // 检查 digit 是否为 null
        if (digit == null) {
            // 如果是，则通过 JdbcTypeToDbSizeDigitConverter 获取 ddlType 对应的数字
            return JdbcTypeToDbSizeDigitConverter.getDigit(ddlType);
        }
        // 返回已存在的 digit 值
        return digit;
    }

    /**
     * 简单构建
     *
     * @param table      表名
     * @param columnName 列名
     * @return DdlColumnWrap
     */
    public static DdlColumnWrap simpleBuild(String table, String columnName) {
        return DdlColumnWrap.builder()
                .table(table)
                .name(columnName)
                .build();
    }

}
